import * as LZString from "./lz-string.min.js";
import * as CryptoJS from "./crypto-js.min.js";

class CompressionEncryption {
  /**
   * 构造函数，可传入 AES 加密密钥
   * @param {string} key - AES 加密密钥（16 字节）
   */
  constructor(key) {
    this.key = key;
  }

  /**
   * 压缩文本
   * @param {string} text - 需要压缩的文本
   * @returns {string} 压缩后的文本
   */
  compressText(text) {
    return LZString.compressToUTF16(text);
  }

  /**
   * 解压缩文本
   * @param {string} compressedText - 压缩后的文本
   * @returns {string} 解压缩后的文本
   */
  decompressText(compressedText) {
    return LZString.decompressFromUTF16(compressedText);
  }

  /**
   * 加密文本
   * @param {string} text - 需要加密的文本
   * @returns {string} 加密后的文本
   */
  encryptText(text) {
    return CryptoJS.AES.encrypt(text, this.key).toString();
  }

  /**
   * 解密文本
   * @param {string} encryptedText - 加密后的文本
   * @returns {string} 解密后的文本
   */
  decryptText(encryptedText) {
    const bytes = CryptoJS.AES.decrypt(encryptedText, this.key);
    return bytes.toString(CryptoJS.enc.Utf8);
  }

  /**
   * 压缩并加密文本
   * @param {string} text - 需要处理的文本
   * @returns {string} 压缩并加密后的文本
   */
  compressAndEncrypt(text) {
    const compressedText = this.compressText(text);
    return this.encryptText(compressedText);
  }

  /**
   * 解密并解压缩文本
   * @param {string} encryptedText - 加密后的文本
   * @returns {string} 解密并解压缩后的文本
   */
  decryptAndDecompress(encryptedText) {
    const decryptedText = this.decryptText(encryptedText);
    return this.decompressText(decryptedText);
  }
}

export default CompressionEncryption;
